package com.itany.shop.listener;

import javax.servlet.ServletContext;
import javax.servlet.annotation.WebListener;
import javax.servlet.http.HttpSessionEvent;
import javax.servlet.http.HttpSessionListener;

/**
 * @Author:石小俊
 * @Date: 2022/12/22 17:03
 * @Version:1.0-SNAPSHOT
 * @Description:
 */
@WebListener
public class InlineCountListener implements HttpSessionListener {

    /**
     * 监听创建session的时机
     * @param event
     * 当创建session时,表示有一个用户访问了当前服务
     * 用户第一次访问服务时,会创建对应的session对象
     */
    @Override
    public void sessionCreated(HttpSessionEvent event) {
        // 当创建session之后,表示有用户访问了当前服务网站,此时在线人数+1
        // 当第一次访问时,可以将在线人数默认值设置为1
        // 该存储的数据在整个应用通用,因此,存放到application中
        // 获取application对象
        ServletContext application = event.getSession().getServletContext();

        // 此处存在并发问题,添加一把同步锁
        synchronized (this) {
            // 取出当前作用域中总人数信息
            Integer count = (Integer) application.getAttribute("count");
            // 当出现第一个访问的用户时,其值尚未存储,则值为null
            if (null == count) {
                // 将其默认值设置为1
                count = 1;
            } else {
                // 如果不是第一个访问的用户,则其值+1
                count++;
            }
            application.setAttribute("count", count);
        }
    }

    @Override
    public void sessionDestroyed(HttpSessionEvent event) {
        // 当session销毁了,则说明用户下线了
        ServletContext application = event.getSession().getServletContext();
        synchronized (this){
            Integer count = (Integer) application.getAttribute("count");
            // 由于销毁一定在创建之后,因此,此处的count必然有值
            count-=1;
            application.setAttribute("count",count);
        }
    }
}
